/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.db.interfaces.Equipe;
import com.rhf.core.dto.EquipeVO;

/**
 * @author fabiensaulnier
 * 
 */
public class EquipeImp extends Base implements Equipe {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Equipe#contructeur(java.sql.ResultSet)
	 */
	public EquipeVO contructeur(ResultSet rs) throws Exception {

		EquipeVO equipeVO = new EquipeVO();

		try {

			equipeVO.setEquipeId(rs.getInt("equipe_id"));
			equipeVO.setDateCreation(rs.getTimestamp("date_creation"));
			equipeVO.setDateModification(rs.getTimestamp("date_modification"));
			equipeVO.setAuteurId(rs.getInt("auteur_id"));
			equipeVO.setCategorieId(rs.getInt("categorie_id"));
			equipeVO.setClubId(rs.getInt("club_id"));
			equipeVO.setLibelle(rs.getString("libelle"));

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return equipeVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Equipe#ajouterEquipe(com.rhf.core.db.valuesobjects
	 * .EquipeVO)
	 */
	public int ajouterEquipe(EquipeVO equipeVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "INSERT INTO equipe ";
		query += "(auteur_id, club_id, categorie_id, libelle) ";
		query += "VALUES (?, ?, ?, ?)";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, equipeVO.getAuteurId());
			stmt.setInt(i++, equipeVO.getClubId());
			stmt.setInt(i++, equipeVO.getCategorieId());
			stmt.setString(i++, equipeVO.getLibelle());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Equipe#modifierEquipe(int)
	 */
	public int modifierEquipe(EquipeVO equipeVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "UPDATE equipe";
		query += "SET date_modification = now(), auteur_id = ? , club_id = ?, categorie_id = ?, libelle = ? ";
		query += "WHERE equipe_id = ?";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, equipeVO.getAuteurId());
			stmt.setInt(i++, equipeVO.getClubId());
			stmt.setInt(i++, equipeVO.getCategorieId());
			stmt.setString(i++, equipeVO.getLibelle());
			stmt.setInt(i++, equipeVO.getClubId());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Equipe#recuperListeEquipe()
	 */
	public List<EquipeVO> recuperListeEquipe() throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<EquipeVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM equipe ORDER BY libelle";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<EquipeVO>();
				list.add(contructeur(rs));
				while (rs.next()) {
					list.add(contructeur(rs));
				}
			}
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * com.rhf.core.db.interfaces.Equipe#recupereListeEquipeParCategorie(int)
	 */
	public List<EquipeVO> recupereListeEquipeParCategorie(int categorieId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<EquipeVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM equipe ";
		query += "WHERE categorie_id = ? ";
		query += "ORDER BY libelle";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, categorieId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<EquipeVO>();
				list.add(contructeur(rs));
				while (rs.next()) {
					list.add(contructeur(rs));
				}
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Equipe#recupererEquipe(int)
	 */
	public EquipeVO recupererEquipe(int equipeId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		EquipeVO equipeVO = null;

		// Requête SQL
		String query = "SELECT * ";
		query += "FROM equipe";
		query += "WHERE equipe_id = ?";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, equipeId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				equipeVO = contructeur(rs);
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return equipeVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Equipe#recupererListeEquipeParClub(int)
	 */
	public List<EquipeVO> recupererListeEquipeParClub(int clubId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<EquipeVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM equipe ";
		query += "WHERE club_id = ? ";
		query += "ORDER BY libelle";

		try {
			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, clubId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<EquipeVO>();
				list.add(contructeur(rs));
				while (rs.next()) {
					list.add(contructeur(rs));
				}
			}
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Equipe#supprimerEquipe(int)
	 */
	public int supprimerEquipe(int equipeId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "DELETE FROM equipe ";
		query += "WHERE equipe_id = ? ";

		try {
			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, equipeId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();
		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

}
